🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / connections / src / commonMain / kotlin / org / meshtastic / feature / connections / ScannerViewModel.kt
Displaying Raw • Download
feature/connections/src/commonMain/kotlin/org/meshtastic/feature/connections/ScannerViewModel.kt e85300531e124df08788c1b765d50af1bf6d516d (e8530053) Text, 10.29 KB
T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.connections
Tff7b72import T7ee787androidx.lifecycle.ViewModel
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharingStarted
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.distinctUntilChanged
Tff7b72import T7ee787kotlinx.coroutines.flow.flatMapLatest
Tff7b72import T7ee787kotlinx.coroutines.flow.flowOn
Tff7b72import T7ee787kotlinx.coroutines.flow.launchIn
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.flow.onEach
Tff7b72import T7ee787kotlinx.coroutines.flow.stateIn
Tff7b72import T7ee787kotlinx.coroutines.flow.update
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.meshtastic.core.datastore.RecentAddressesDataSource
Tff7b72import T7ee787org.meshtastic.core.datastore.model.RecentAddress
Tff7b72import T7ee787org.meshtastic.core.model.RadioController
Tff7b72import T7ee787org.meshtastic.core.model.util.anonymize
Tff7b72import T7ee787org.meshtastic.core.repository.RadioInterfaceService
Tff7b72import T7ee787org.meshtastic.core.repository.RadioPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.ServiceRepository
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.feature.connections.model.DeviceListEntry
Tff7b72import T7ee787org.meshtastic.feature.connections.model.GetDiscoveredDevicesUseCase
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72open Tff7b72class T56d364ScannerViewModelTb4b4b4(
Tff7b72protected Tff7b72val Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioControllerTb4b4b4: Te6edf3RadioControllerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceServiceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioPrefsTb4b4b4: Te6edf3RadioPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3recentAddressesDataSourceTb4b4b4: Te6edf3RecentAddressesDataSourceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3getDiscoveredDevicesUseCaseTb4b4b4: Te6edf3GetDiscoveredDevicesUseCaseTb4b4b4,
Tff7b72private Tff7b72val Te6edf3dispatchersTb4b4b4: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3diTb4b4b4.Te6edf3CoroutineDispatchersTb4b4b4,
Tff7b72private Tff7b72val Te6edf3bleScannerTb4b4b4: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3bleTb4b4b4.Te6edf3BleScannerTff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3ViewModelTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3_showMockTransport Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3showMockTransportTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_showMockTransportTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3_errorText Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3errorTextTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3_errorTextTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3isBleScanningState Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3isBleScanningTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3isBleScanningStateTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3scannedBleDevices Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3bleTb4b4b4.Te6edf3BleDeviceTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72private Tff7b72var Te6edf3scanJobTb4b4b4: Te6edf3kotlinxTb4b4b4.Te6edf3coroutinesTb4b4b4.Te6edf3JobTff7b72? Tff7b72= Tff7b72null
Tff7b72init Tb4b4b4{
Te6edf3_showMockTransportTb4b4b4.Te6edf3value Tff7b72= Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3isMockTransportTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72fun Td2a8ffstartBleScanTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isBleScanningStateTb4b4b4.Te6edf3value Tff7b72|Tff7b72| Te6edf3bleScanner Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72return
Te6edf3isBleScanningStateTb4b4b4.Te6edf3value Tff7b72= Tff7b72true
Te6edf3scannedBleDevicesTb4b4b4.Te6edf3value Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)
Te6edf3scanJob Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3bleScanner
Tb4b4b4.Te6edf3scanTb4b4b4(
Te6edf3timeout Tff7b72= Te6edf3kotlinTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3DurationTb4b4b4.Te6edf3INFINITETb4b4b4,
Te6edf3serviceUuid Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3bleTb4b4b4.Te6edf3MeshtasticBleConstantsTb4b4b4.Te6edf3SERVICE_UUIDTb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4)
Tb4b4b4.Te6edf3collect Tb4b4b4{ Te6edf3device Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3scannedBleDevicesTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3deviceTb4b4b4.Te6edf3addressTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3scannedBleDevicesTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3current Tff7b72-Tff7b72> Te6edf3current Tff7b72+ Tb4b4b4(Te6edf3deviceTb4b4b4.Te6edf3address Te6edf3to Te6edf3deviceTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooGenericExceptionCaughtTa5d6ff"Tb4b4b4) Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3coTb4b4b4.Te6edf3touchlabTb4b4b4.Te6edf3kermitTb4b4b4.Te6edf3LoggerTb4b4b4.Te6edf3wTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffBLE scan failedTa5d6ff" Tb4b4b4}
Tb4b4b4} Tff7b72finally Tb4b4b4{
Te6edf3isBleScanningStateTb4b4b4.Te6edf3value Tff7b72= Tff7b72false
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffstopBleScanTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3scanJobTff7b72?.Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3scanJob Tff7b72= Tff7b72null
Te6edf3isBleScanningStateTb4b4b4.Te6edf3value Tff7b72= Tff7b72false
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3discoveredDevicesFlow Tff7b72=
Te6edf3showMockTransport
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3showMock Tff7b72-Tff7b72> Te6edf3getDiscoveredDevicesUseCaseTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3showMockTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4, Tff7b72nullTb4b4b4)
T8b949e/** A combined list of bonded and scanned BLE devices for the UI. */
Tff7b72val Te6edf3bleDevicesForUiTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tff7b72> Tff7b72=
Te6edf3kotlinxTb4b4b4.Te6edf3coroutinesTb4b4b4.Te6edf3flow
Tb4b4b4.Te6edf3combineTb4b4b4(Te6edf3discoveredDevicesFlowTb4b4b4, Te6edf3scannedBleDevicesTb4b4b4) Tb4b4b4{ Te6edf3discoveredTb4b4b4, Te6edf3scannedMap Tff7b72-Tff7b72>
Tff7b72val Te6edf3bonded Tff7b72= Te6edf3discoveredTff7b72?.Te6edf3bleDevicesTff7b72?.Te6edf3filterIsInstanceTff7b72<Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTff7b72>Tb4b4b4(Tb4b4b4) Tff7b72?: Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3bondedAddresses Tff7b72= Te6edf3bondedTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3address Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)
T8b949e// Add scanned devices that aren't already in the bonded list.
T8b949e// These are explicitly marked as unbonded so the UI routes through
T8b949e// requestBonding() — which on Android triggers createBond() for the
T8b949e// pairing dialog before connecting.
Tff7b72val Te6edf3unbondedScanned Tff7b72=
Te6edf3scannedMapTb4b4b4.Te6edf3values
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3address Tff7b72!in Te6edf3bondedAddresses Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTb4b4b4(Te6edf3device Tff7b72= Tffa657itTb4b4b4, Te6edf3bonded Tff7b72= Tff7b72falseTb4b4b4) Tb4b4b4}
T8b949e// Sort by name
Tb4b4b4(Te6edf3bonded Tff7b72+ Te6edf3unbondedScannedTb4b4b4)Tb4b4b4.Te6edf3sortedBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3name Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3defaultTb4b4b4)
Tb4b4b4.Te6edf3distinctUntilChangedTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e/** UI StateFlow for USB devices. */
Tff7b72val Te6edf3usbDevicesForUiTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tff7b72> Tff7b72=
Te6edf3discoveredDevicesFlow
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTff7b72?.Te6edf3usbDevices Tff7b72?: Te6edf3emptyListTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3distinctUntilChangedTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e/** UI StateFlow for discovered TCP devices (NSD). */
Tff7b72val Te6edf3discoveredTcpDevicesForUiTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tff7b72> Tff7b72=
Te6edf3discoveredDevicesFlow
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTff7b72?.Te6edf3discoveredTcpDevices Tff7b72?: Te6edf3emptyListTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3distinctUntilChangedTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e/** UI StateFlow for recent TCP devices. */
Tff7b72val Te6edf3recentTcpDevicesForUiTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72>Tff7b72> Tff7b72=
Te6edf3discoveredDevicesFlow
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTff7b72?.Te6edf3recentTcpDevices Tff7b72?: Te6edf3emptyListTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3distinctUntilChangedTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3selectedAddressFlowTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3currentDeviceAddressFlow
T8b949e/** The persisted device name from the last selection, for use as a UI fallback. */
Tff7b72val Te6edf3persistedDeviceNameTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3radioPrefsTb4b4b4.Te6edf3devName
Tff7b72val Te6edf3selectedNotNullFlowTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657StringTff7b72> Tff7b72=
Te6edf3selectedAddressFlow
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657it Tff7b72?: Te6edf3NO_DEVICE_SELECTED Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3selectedAddressFlowTb4b4b4.Te6edf3value Tff7b72?: Te6edf3NO_DEVICE_SELECTEDTb4b4b4)
Tff7b72val Te6edf3supportedDeviceTypesTb4b4b4: Te6edf3ListTff7b72<Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3DeviceTypeTff7b72> Tff7b72= Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3supportedDeviceTypes
Tff7b72init Tb4b4b4{
Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionProgressTb4b4b4.Te6edf3onEach Tb4b4b4{ Te6edf3_errorTextTb4b4b4.Te6edf3value Tff7b72= Tffa657it Tb4b4b4}Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffScannerViewModel createdTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffonClearedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onClearedTb4b4b4(Tb4b4b4)
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffScannerViewModel clearedTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetErrorTextTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3_errorTextTb4b4b4.Te6edf3value Tff7b72= Te6edf3text
Tb4b4b4}
Tff7b72fun Td2a8ffchangeDeviceAddressTb4b4b4(Te6edf3addressTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3i Tb4b4b4{ Ta5d6ff"Ta5d6ffAttempting to change device address to Tffd700${Te6edf3addressTb4b4b4.Te6edf3anonymizeTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff" Tb4b4b4}
Te6edf3radioControllerTb4b4b4.Te6edf3setDeviceAddressTb4b4b4(Te6edf3addressTb4b4b4)
Tb4b4b4}
Tff7b72fun Td2a8ffaddRecentAddressTb4b4b4(Te6edf3addressTb4b4b4: Tffa657StringTb4b4b4, Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3addressTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72return
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3recentAddressesDataSourceTb4b4b4.Te6edf3addTb4b4b4(Te6edf3RecentAddressTb4b4b4(Te6edf3addressTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffremoveRecentAddressTb4b4b4(Te6edf3addressTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3recentAddressesDataSourceTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3addressTb4b4b4) Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Called by the GUI when a new device has been selected by the user.
*
* @return true if the connection was initiated immediately.
*/
Tff7b72fun Td2a8ffonSelectedTb4b4b4(Tffa657itTb4b4b4: Te6edf3DeviceListEntryTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Tff7b72when Tb4b4b4(Tffa657itTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3DeviceListEntryTb4b4b4.Te6edf3Ble Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3bondedTb4b4b4) Tb4b4b4{
Te6edf3radioPrefsTb4b4b4.Te6edf3setDevNameTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3changeDeviceAddressTb4b4b4(Tffa657itTb4b4b4.Te6edf3fullAddressTb4b4b4)
Tff7b72true
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3requestBondingTb4b4b4(Tffa657itTb4b4b4)
Tff7b72false
Tb4b4b4}
Tb4b4b4}
Tff7b72is Te6edf3DeviceListEntryTb4b4b4.Te6edf3Usb Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657itTb4b4b4.Te6edf3bondedTb4b4b4) Tb4b4b4{
Te6edf3radioPrefsTb4b4b4.Te6edf3setDevNameTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3changeDeviceAddressTb4b4b4(Tffa657itTb4b4b4.Te6edf3fullAddressTb4b4b4)
Tff7b72true
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3requestPermissionTb4b4b4(Tffa657itTb4b4b4)
Tff7b72false
Tb4b4b4}
Tb4b4b4}
Tff7b72is Te6edf3DeviceListEntryTb4b4b4.Te6edf3Tcp Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3radioPrefsTb4b4b4.Te6edf3setDevNameTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3addRecentAddressTb4b4b4(Tffa657itTb4b4b4.Te6edf3fullAddressTb4b4b4, Tffa657itTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3changeDeviceAddressTb4b4b4(Tffa657itTb4b4b4.Te6edf3fullAddressTb4b4b4)
Tb4b4b4}
Tff7b72true
Tb4b4b4}
Tff7b72is Te6edf3DeviceListEntryTb4b4b4.Te6edf3Mock Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3radioPrefsTb4b4b4.Te6edf3setDevNameTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3changeDeviceAddressTb4b4b4(Tffa657itTb4b4b4.Te6edf3fullAddressTb4b4b4)
Tff7b72true
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Initiates the bonding process and connects to the device upon success.
*
* The default implementation connects directly without explicit bonding, which is correct for Desktop/JVM where the
* OS Bluetooth stack handles pairing during the GATT connection. Android overrides this to call `createBond()`
* first.
*/
Tff7b72protected Tff7b72open Tff7b72fun Td2a8ffrequestBondingTb4b4b4(Te6edf3entryTb4b4b4: Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTb4b4b4) Tb4b4b4{
Te6edf3changeDeviceAddressTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3fullAddressTb4b4b4)
Tb4b4b4}
Tff7b72protected Tff7b72open Tff7b72fun Td2a8ffrequestPermissionTb4b4b4(Te6edf3entryTb4b4b4: Te6edf3DeviceListEntryTb4b4b4.Te6edf3UsbTb4b4b4) Tb4b4b4{Tb4b4b4}
Tff7b72fun Td2a8ffdisconnectTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3radioPrefsTb4b4b4.Te6edf3setDevNameTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3changeDeviceAddressTb4b4b4(Te6edf3NO_DEVICE_SELECTEDTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72const Tff7b72val Te6edf3NO_DEVICE_SELECTED Tff7b72= Ta5d6ff"Ta5d6ffnTa5d6ff"
Served by rngit 1.5.0 - Generated in 0.08s